<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="author" content="wangbo">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <h1>我是chp</h1>
  <script>
    // let sum = new Function("a", "b", "return a+b")
    function sum(a, b) {
      return a + b
    }
    let ss = new sum(1, 2)


    // 对象
    // 要清楚原型链,首先要弄清楚对象：
    // 普通对象
    // 最普通的对象：有__proto__属性（指向其原型链），没有prototype属性。
    // 原型对象(Person.prototype 原型对象还有constructor属性（指向构造函数对象）)
    console.log("原型对象-------------");
    function Person() { }
    var p = new Person();
    var o1 = new F1();
    var o2 = {};
    var o3 = new Object();
    console.log(typeof null);  //O
    console.log(typeof o1);  //Object  
    console.log(typeof o2);   //Object  
    console.log(typeof o3);   //Object  
    console.log(typeof p);  //Object  
    console.log(typeof Person.prototype) //Object  
    console.log(Person.prototype)
    console.log(typeof Object.prototype) // Object  
    console.log(Object.prototype)  //[Object: null prototype] {} 空对象没有原型
    console.log(Object.prototype.prototype)  //undefined
    console.log(Object.prototype.__proto__) //null
    console.log(Object.prototype.__proto__ === null) //true
    console.log(typeof Function.prototype) // 特殊 Function  function
    console.log(Function.prototype) // 特殊 Function  {} 虽然是原型对象但是是函数
    console.log(typeof Function.prototype.__proto__) //object 却没有prototype属性 
    console.log(typeof Function.prototype.prototype) //undefined 函数对象却没有prototype属性 

    // 函数对象：
    // 凡是通过new Function()创建的都是函数对象。
    // 拥有__proto__、prototype属性（指向原型对象）。
    // Function、Object、Array、Date、String、自定义函数
    // 特例： Function.prototype(是原型对象，却是函数对象),并且Function.__proto__===Function.prototype
    // F1 函数对象
    function F1() { };
    var F2 = function () { };
    // Javascript 中的 Object 是一个内置Function对象
    console.log("函数对象---------");  //function  
    console.log(typeof F1);  //function  
    console.log(typeof F2);  //function  
    console.log(typeof Object);   //function  
    console.log(Object.__proto__ === Function.prototype);   //true  
    console.log(typeof Array);   //function  
    console.log(typeof Array.__proto__);   //function  
    console.log(typeof String);   //function  
    console.log(typeof Date);   //function  
    console.log(typeof Function);   //function  
    console.log(Function.__proto__ === Function.prototype);   //true  


    console.log(sum.prototype.prototype);
    console.log(sum.__proto__ === Function.prototype);
    console.log(Object.__proto__ === Function.prototype);
    console.log(Function.__proto__ === Function.prototype);
    console.log(typeof Function.prototype);
    console.log(Function.prototype.prototype);
    console.log(Function.prototype.__proto__ === Object.prototype);
  </script>
</body>

</html>